var extend = require("extend");
var fs = require("fs");
var excelExport = require('excel-export');
var guid = require('guid');
var path = require('path');
var excel = function() {
    this.req = null;
    this.resp = null;
};
/**
 * 生成excel文件
 * @param params
 */
excel.prototype.createExcel = function(params) {
    var setting = { savePath: "uploadFile/excel/" };
    setting = extend({}, setting, params);
    var uuid = guid.create();
    var data = params.data || "";
    var result = excelExport.execute(data);
    var name = 'excel' + uuid + '.xlsx';
    var filePath = path.resolve(setting.savePath, name);
    fs.writeFile(filePath, result, 'binary', function(err) {
        setting.cb(filePath);
    });
}
/**
 * 计算上次的断点信息
 * @param range
 * @returns {number}
 * @private
 */
excel.prototype._calStartPosition = function(range) {
    var startPos = 0;
    if (typeof range != 'undefined') {
        var startPosMatch = /^bytes=([0-9]+)-$/.exec(range);
        startPos = Number(startPosMatch[1]);
    }
    return startPos;
}
excel.prototype._configHeader = function(config) {
    var startPos = config.startPos,
        fileSize = config.fileSize,
        resp = this.resp;
    // 如果startPos为0，表示文件从0开始下载的，否则则表示是断点下载的。
    if (startPos == 0) {
        resp.setHeader('Accept-Range', 'bytes');
    } else {
        resp.setHeader('Content-Range', 'bytes ' + startPos + '-' + (fileSize - 1) + '/' + fileSize);
    }
    resp.writeHead(206, 'Partial Content', {
        'Content-Type': 'application/octet-stream'
    });
}
excel.prototype._init = function(filePath, down) {
    var config = {};
    var self = this;
    fs.stat(filePath, function(error, state) {
        if (error)
            throw error;
        config.fileSize = state.size;
        var range = self.req.headers.range;
        config.startPos = self._calStartPosition(range);
        self.config = config;
        self._configHeader(config);
        down();
    });
}
/**
 * 下载文件
 * @param filePath 文件路径
 * @param req
 * @param res
 * @param isDeleted 下载完成后是否删除文件，true删除
 */
excel.prototype.download = function(filePath, req, res, isDeleted) {
    var self = this;
    self.req = req;
    self.resp = res;
    path.exists(filePath, function(exist) {
        if (exist) {
            self._init(filePath, function() {
                var config = self.config
                resp = self.resp;
                fReadStream = fs.createReadStream(filePath, {
                    encoding: 'binary',
                    bufferSize: 1024 * 1024,
                    start: config.startPos,
                    end: config.fileSize
                });
                fReadStream.on('data', function(chunk) {
                    resp.write(chunk, 'binary');
                });
                fReadStream.on('end', function() {
                    //是否删除文件
                    if (isDeleted) {
                        fs.unlink(filePath, function(err, res) {});
                    }
                    resp.end();
                });
            });
        } else {
            console.log('文件不存在！');
            return;
        }
    });
}
module.exports = new excel();

// 调用
// var excel = require('../lib/excelHelper.js');
// exports.exportExcel = function(req, res) {
//     var conf = {};
//     conf.cols = [
//         { caption: 'string', type: 'string' },
//         { caption: 'date', type: 'string' },
//         { caption: 'bool', type: 'bool' },
//         { caption: 'number', type: 'number' }
//     ];
//     conf.rows = [
//         ['pi', '2015-06-29', true, 3.14],
//         ["e", '2015-06-29', false, 2.7182]
//     ];
//     var filename = "导出excel.xlsx";
//     res.setHeader('Content-Disposition', 'attachment; filename=' + encodeURIComponent(filename));
//     excel.createExcel({
//         data: conf,
//         savePath: "uploadFile/excel/",
//         cb: function(path) {
//             excel.download(path, req, res, true);
//         }
//     });
// }